/*
 * @Descripttion: 基础请求方式 get、post、put、del、postReq（content-type封装）、binaryReq（响应体arraybuffer）、blobReq（响应体blob）
 * @version:
 * @Author: lhl
 * @Date: 2024-09-04 16:12:51
 * @LastEditors: lhl
 * @LastEditTime: 2024-09-04 23:16:39
 */
import request from '@/utils/request';

// 封装 GET 请求方法
export function get(url: string, params?: any, config?: any) {
  return request({
    url,
    method: 'get',
    params,
    ...config
  });
}

// 封装 POST 请求方法 默认json格式
export function post(url: string, data?: any, config?: any) {
  return request({
    url,
    method: 'post',
    data,
    ...config
  });
}

// 封装 PUT 请求方法
export function put(url: string, data?: any, config?: any) {
  return request({
    url,
    method: 'put',
    data,
    ...config
  });
}

// 封装 DELETE 请求方法
export function del(url: string, params?: any, config?: any) {
  return request({
    url,
    method: 'delete',
    params,
    ...config
  });
}

// 封装 POST 请求方法，根据 Content-Type 处理数据
export function postReq(url: string, data?: any, contentType: 'json' | 'form' | 'multipart' = 'json', config?: any) {
  let processedData = data;
  const headers = { ...config?.headers };

  switch (contentType) {
    case 'json': {
      headers['Content-Type'] = 'application/json';
      processedData = JSON.stringify(data);
      break;
    }
    case 'form': {
      headers['Content-Type'] = 'application/x-www-form-urlencoded';
      // 例如 name=John&age=30 和 qs.stringify(data) 有一样的效果
      processedData = new URLSearchParams(data).toString();

      break;
    }
    case 'multipart': {
      headers['Content-Type'] = 'multipart/form-data';
      const formData = new FormData();
      for (const key in data) {
        // 这样确保 Boolean & Number 的值不会过滤掉，例如 { test: false, test2: 0 } 如果直接使用 if(data[key]){} 则会过隐式滤掉
        if (data[key] !== null && data[key] !== undefined && data[key] !== '') {
          formData.append(key, data[key]);
        }
      }
      processedData = formData;
      break;
    }
    default:
      throw new Error('Unsupported Content-Type');
  }

  return request({
    url,
    method: 'post',
    data: processedData,
    headers,
    ...config
  });
}

// 封装返回二进制响应体的请求方法
export function binaryReq(url: string, method: 'get' | 'post' = 'get', data?: any, config?: any) {
  return request({
    url,
    method,
    data,
    // ArrayBuffer 是一个通用的、固定长度的二进制数据缓冲区
    // 它不能直接操作，而是需要通过 TypedArray 视图（如 Uint8Array、Float32Array 等）或 DataView 视图来读写数据
    responseType: 'arraybuffer', // 指定响应类型为 arraybuffer
    ...config
  });
}

// 封装返回 Blob 响应体的请求方法
export function blobReq(url: string, method: 'get' | 'post' = 'get', data?: any, config?: any) {
  return request({
    url,
    method,
    data,
    // Blob 表示不可变的、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取
    // 主要用于处理文件（如图片、音频、视频等）和网络请求的响应体，适合用于文件下载、上传和展示
    responseType: 'blob', // 指定响应类型为 blob
    ...config
  });
}
